home *** CD-ROM | disk | FTP | other *** search
/ PC PowerPlay 58 / pcpp58a.iso / extras / quake 3 source / Q3A_ToolSource.exe / Main / PatchDialog.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2001-01-02  |  7.4 KB  |  334 lines

  1. // PatchDialog.cpp : implementation file
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "Radiant.h"
  6. #include "PatchDialog.h"
  7. #include "TextureLayout.h"
  8.  
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14.  
  15. /////////////////////////////////////////////////////////////////////////////
  16. // CPatchDialog dialog
  17.  
  18. CPatchDialog g_PatchDialog;
  19.  
  20. CPatchDialog::CPatchDialog(CWnd* pParent /*=NULL*/)
  21.     : CDialog(CPatchDialog::IDD, pParent)
  22. {
  23.     //{{AFX_DATA_INIT(CPatchDialog)
  24.     m_strName = _T("");
  25.     m_fS = 0.0f;
  26.     m_fT = 0.0f;
  27.     m_fX = 0.0f;
  28.     m_fY = 0.0f;
  29.     m_fZ = 0.0f;
  30.     m_fHScale = 0.05f;
  31.     m_fHShift = 0.05f;
  32.     m_fRotate = 45;
  33.     m_fVScale = 0.05f;
  34.     m_fVShift = 0.05f;
  35.     //}}AFX_DATA_INIT
  36.     m_Patch = NULL;
  37. }
  38.  
  39.  
  40. void CPatchDialog::DoDataExchange(CDataExchange* pDX)
  41. {
  42.     CDialog::DoDataExchange(pDX);
  43.     //{{AFX_DATA_MAP(CPatchDialog)
  44.     DDX_Control(pDX, IDC_SPIN_VSHIFT, m_wndVShift);
  45.     DDX_Control(pDX, IDC_SPIN_VSCALE, m_wndVScale);
  46.     DDX_Control(pDX, IDC_SPIN_ROTATE, m_wndRotate);
  47.     DDX_Control(pDX, IDC_SPIN_HSHIFT, m_wndHShift);
  48.     DDX_Control(pDX, IDC_SPIN_HSCALE, m_wndHScale);
  49.     DDX_Control(pDX, IDC_COMBO_TYPE, m_wndType);
  50.     DDX_Control(pDX, IDC_COMBO_ROW, m_wndRows);
  51.     DDX_Control(pDX, IDC_COMBO_COL, m_wndCols);
  52.     DDX_Text(pDX, IDC_EDIT_NAME, m_strName);
  53.     DDX_Text(pDX, IDC_EDIT_S, m_fS);
  54.     DDX_Text(pDX, IDC_EDIT_T, m_fT);
  55.     DDX_Text(pDX, IDC_EDIT_X, m_fX);
  56.     DDX_Text(pDX, IDC_EDIT_Y, m_fY);
  57.     DDX_Text(pDX, IDC_EDIT_Z, m_fZ);
  58.     DDX_Text(pDX, IDC_HSCALE, m_fHScale);
  59.     DDX_Text(pDX, IDC_HSHIFT, m_fHShift);
  60.     DDX_Text(pDX, IDC_ROTATE, m_fRotate);
  61.     DDX_Text(pDX, IDC_VSCALE, m_fVScale);
  62.     DDX_Text(pDX, IDC_VSHIFT, m_fVShift);
  63.     //}}AFX_DATA_MAP
  64. }
  65.  
  66.  
  67. BEGIN_MESSAGE_MAP(CPatchDialog, CDialog)
  68.     //{{AFX_MSG_MAP(CPatchDialog)
  69.     ON_BN_CLICKED(IDC_BTN_PATCHDETAILS, OnBtnPatchdetails)
  70.     ON_BN_CLICKED(IDC_BTN_PATCHFIT, OnBtnPatchfit)
  71.     ON_BN_CLICKED(IDC_BTN_PATCHNATURAL, OnBtnPatchnatural)
  72.     ON_BN_CLICKED(IDC_BTN_PATCHRESET, OnBtnPatchreset)
  73.     ON_CBN_SELCHANGE(IDC_COMBO_COL, OnSelchangeComboCol)
  74.     ON_CBN_SELCHANGE(IDC_COMBO_ROW, OnSelchangeComboRow)
  75.     ON_CBN_SELCHANGE(IDC_COMBO_TYPE, OnSelchangeComboType)
  76.     ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_HSCALE, OnDeltaposSpin)
  77.     ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_ROTATE, OnDeltaposSpin)
  78.     ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_VSCALE, OnDeltaposSpin)
  79.     ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_VSHIFT, OnDeltaposSpin)
  80.     ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_HSHIFT, OnDeltaposSpin)
  81.     ON_WM_DESTROY()
  82.     ON_BN_CLICKED(ID_APPLY, OnApply)
  83.     //}}AFX_MSG_MAP
  84. END_MESSAGE_MAP()
  85.  
  86. /////////////////////////////////////////////////////////////////////////////
  87. // CPatchDialog message handlers
  88.  
  89. void CPatchDialog::OnBtnPatchdetails() 
  90. {
  91.   Patch_NaturalizeSelected(true);
  92.   Sys_UpdateWindows(W_ALL);
  93. }
  94.  
  95. void CPatchDialog::OnBtnPatchfit() 
  96. {
  97.   Patch_FitTexturing();
  98.   Sys_UpdateWindows(W_ALL);
  99. }
  100.  
  101. void CPatchDialog::OnBtnPatchnatural() 
  102. {
  103.   Patch_NaturalizeSelected();
  104.   Sys_UpdateWindows(W_ALL);
  105. }
  106.  
  107. void CPatchDialog::OnBtnPatchreset() 
  108. {
  109.   CTextureLayout dlg;
  110.   if (dlg.DoModal() == IDOK)
  111.   {
  112.     Patch_ResetTexturing(dlg.m_fX, dlg.m_fY);
  113.   }
  114.   Sys_UpdateWindows(W_ALL);
  115. }
  116.  
  117. void CPatchDialog::OnSelchangeComboCol() 
  118. {
  119.   UpdateRowColInfo();
  120. }
  121.  
  122. void CPatchDialog::OnSelchangeComboRow() 
  123. {
  124.   UpdateRowColInfo();
  125. }
  126.  
  127. void CPatchDialog::OnSelchangeComboType() 
  128. {
  129.     // TODO: Add your control notification handler code here
  130.     
  131. }
  132.  
  133. void CPatchDialog::OnOK() 
  134. {
  135.   m_Patch = NULL;
  136.     
  137.     CDialog::OnOK();
  138. }
  139.  
  140. void CPatchDialog::OnDeltaposSpin(NMHDR* pNMHDR, LRESULT* pResult) 
  141. {
  142.     NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
  143.   UpdateSpinners((pNMUpDown->iDelta > 0), pNMUpDown->hdr.idFrom);
  144.     *pResult = 0;
  145. }
  146.  
  147. BOOL CPatchDialog::OnInitDialog() 
  148. {
  149.     CDialog::OnInitDialog();
  150.     
  151.   m_wndHScale.SetRange(0, 1000);
  152.   m_wndVScale.SetRange(0, 1000);
  153.   m_wndHShift.SetRange(0, 1000);
  154.   m_wndVShift.SetRange(0, 1000);
  155.   m_wndRotate.SetRange(0, 1000);
  156.  
  157.   GetPatchInfo();
  158.  
  159.     // TODO: Add extra initialization here
  160.     
  161.     return TRUE;  // return TRUE unless you set the focus to a control
  162.                   // EXCEPTION: OCX Property Pages should return FALSE
  163. }
  164.  
  165.  
  166.  
  167. void CPatchDialog::GetPatchInfo()
  168. {
  169.   m_Patch = SinglePatchSelected();
  170.   if (m_Patch != NULL)
  171.   {
  172.     CString str;
  173.     int i;
  174.     m_wndRows.ResetContent();
  175.     for (i = 0; i < m_Patch->height; i++)
  176.     {
  177.       str.Format("%i", i);
  178.       m_wndRows.AddString(str);
  179.     }
  180.     m_wndRows.SetCurSel(0);
  181.     m_wndCols.ResetContent();
  182.     for (i = 0; i < m_Patch->width; i++)
  183.     {
  184.       str.Format("%i", i);
  185.       m_wndCols.AddString(str);
  186.     }
  187.     m_wndCols.SetCurSel(0);
  188.   }
  189.   UpdateRowColInfo();
  190. }
  191.  
  192. void CPatchDialog::SetPatchInfo()
  193. {
  194.  
  195. }
  196.  
  197. void DoPatchInspector()
  198. {
  199.   if (g_PatchDialog.GetSafeHwnd() == NULL)
  200.   {
  201.     g_PatchDialog.Create(IDD_DIALOG_PATCH);
  202.     CRect rct;
  203.       LONG lSize = sizeof(rct);
  204.       if (LoadRegistryInfo("Radiant::PatchWindow", &rct, &lSize))
  205.     {
  206.       g_PatchDialog.SetWindowPos(NULL, rct.left, rct.top, 0,0, SWP_NOSIZE);
  207.     }
  208.   }
  209.   g_PatchDialog.ShowWindow(SW_SHOW);
  210.   g_PatchDialog.GetPatchInfo();
  211. }
  212.  
  213. void UpdatePatchInspector()
  214. {
  215.   if (g_PatchDialog.GetSafeHwnd() != NULL)
  216.   {
  217.     g_PatchDialog.UpdateInfo();
  218.   }
  219.  
  220. }
  221.  
  222. void CPatchDialog::OnDestroy() 
  223. {
  224.   if (GetSafeHwnd())
  225.   {
  226.     CRect rct;
  227.     GetWindowRect(rct);
  228.       SaveRegistryInfo("Radiant::PatchWindow", &rct, sizeof(rct));
  229.   }
  230.     CDialog::OnDestroy();
  231. }
  232.  
  233. void CPatchDialog::UpdateRowColInfo()
  234. {
  235.   m_fX = m_fY = m_fZ = m_fS = m_fT = 0.0;
  236.  
  237.   if (m_Patch != NULL)
  238.   {
  239.     int r = m_wndRows.GetCurSel();
  240.     int c = m_wndCols.GetCurSel();
  241.     if (r >= 0 && r < m_Patch->height && c >= 0 && c < m_Patch->width)
  242.     {
  243.       m_fX = m_Patch->ctrl[c][r].xyz[0];
  244.       m_fY = m_Patch->ctrl[c][r].xyz[1];
  245.       m_fZ = m_Patch->ctrl[c][r].xyz[2];
  246.       m_fS = m_Patch->ctrl[c][r].st[0];
  247.       m_fT = m_Patch->ctrl[c][r].st[1];
  248.     }
  249.   }
  250.   UpdateData(FALSE);
  251. }
  252.  
  253. void CPatchDialog::UpdateInfo()
  254. {
  255.   GetPatchInfo();
  256. }
  257.  
  258. void CPatchDialog::OnApply() 
  259. {
  260.     UpdateData(TRUE);
  261.   if (m_Patch != NULL)
  262.   {
  263.     int r = m_wndRows.GetCurSel();
  264.     int c = m_wndCols.GetCurSel();
  265.     if (r >= 0 && r < m_Patch->height && c >= 0 && c < m_Patch->width)
  266.     {
  267.       m_Patch->ctrl[c][r].xyz[0] = m_fX;
  268.       m_Patch->ctrl[c][r].xyz[1] = m_fY;
  269.       m_Patch->ctrl[c][r].xyz[2] = m_fZ;
  270.       m_Patch->ctrl[c][r].st[0] = m_fS;
  271.       m_Patch->ctrl[c][r].st[1] = m_fT;
  272.       m_Patch->bDirty = true;
  273.       Sys_UpdateWindows(W_ALL);
  274.     }
  275.   }
  276. }
  277.  
  278. void CPatchDialog::UpdateSpinners(bool bUp, int nID)
  279. {
  280.   texdef_t td;
  281.  
  282.   td.rotate = 0.0;
  283.   td.scale[0] = td.scale[1] = 0.0;
  284.   td.shift[0] = td.shift[1] = 0.0;
  285.   td.contents = 0;
  286.   td.flags = 0;
  287.   td.value = 0;
  288.  
  289.  
  290.   UpdateData(TRUE);
  291.  
  292.   if (nID == IDC_SPIN_ROTATE)
  293.   {
  294.       if (bUp)
  295.           td.rotate = m_fRotate;
  296.         else
  297.           td.rotate = -m_fRotate;
  298.     }
  299.   else if (nID == IDC_SPIN_HSCALE)
  300.     {
  301.       if (bUp)
  302.         td.scale[0] = 1 - m_fHScale;
  303.       else
  304.           td.scale[0] = 1 + m_fHScale;
  305.   } 
  306.   else if (nID == IDC_SPIN_VSCALE)
  307.     {
  308.       if (bUp)
  309.           td.scale[1] = 1 - m_fVScale;
  310.         else
  311.           td.scale[1] = 1 + m_fVScale;
  312.   } 
  313.       
  314.   else if (nID == IDC_SPIN_HSHIFT)
  315.     {
  316.       if (bUp)
  317.           td.shift[0] = m_fHShift;
  318.         else
  319.           td.shift[0] = -m_fHShift;
  320.     }
  321.   else if (nID == IDC_SPIN_VSHIFT)
  322.     {
  323.       if (bUp)
  324.         td.shift[1] = m_fVShift;
  325.         else
  326.           td.shift[1] = -m_fVShift;
  327.     }
  328.   
  329.   Patch_SetTextureInfo(&td);
  330.   Sys_UpdateWindows(W_CAMERA);
  331. }
  332.  
  333.  
  334.